//package cn.itsource.itsource.controller;
//
//import cn.itsource.itsource.config.alipay.AlipayConfig;
//import cn.itsource.itsource.config.alipay.AlipayParams;
//import cn.itsource.itsource.config.alipay.AlipayService;
//import cn.itsource.itsource.dto.PayDto;
//import com.alipay.api.AlipayApiException;
//import com.alipay.api.internal.util.AlipaySignature;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.Map;
//
//@RestController
//@RequestMapping("/pay")
//public class PayController {
//    @Autowired
//    private AlipayParams alipayParams;
//
//    @Autowired
//    private AlipayService alipayInfoService;
//
//    /**
//     * 这个方法，用于前端点击“提交订单”，生成并跳转到支付宝的 带二维码的支付界面
//     *
//     * @param dto
//     * @return
//     */
//    @PostMapping("/gobuy")
//    public String goBuy(@RequestBody PayDto dto) {
//        return alipayInfoService.createPayUrl(dto.getMoney(),dto.getSubject());
//    }
//
//    //用户支付订单完成后，就会同步回调当前请求
//    @GetMapping("/returnUrl")
//    public String returnUrl(String out_trade_no, String total_amount, String trade_no) {
//        System.out.println(">>>>>>>>>returnUrl>>>>>>>>>>>" + out_trade_no + "," + total_amount + "," + trade_no);
//        return null;
//    }
//
//
//    /**
//     * 真实环境中，会使用这种方式进行操作。
//     * 特点：比returnUrl更安全
//     * 异步请求：默认情况下，只要触发了设置的回调URL，
//     * 则说明，此次用户支付的操作：tradeStatus.TRADE_SUCCESS	支付成功	1
//     * 【离线付】
//     * <p>
//     * ---------------------- 注意事项：
//     * 在使用这个notify的回调地址，需要注意如下几点：
//     * 1. 需要在支付宝开放平台中，配置回调地址
//     * 这个回调必须可以  外网访问 （如果是本地测试，需要使用内网穿透工具）
//     * 穿透工具： natapp 或  花生壳
//     * <p>
//     * 2. 在代码中，发起支付请求时，配置的notifyurl参数，必须与 控制台配置的回调地址一样
//     *
//     * @return
//     */
//    @RequestMapping("/notifyUrl")
//    public String notifyUrl(HttpServletRequest request) throws AlipayApiException {
//        System.out.println(">>>>>>>>>notifyUrl>>>>>>>");
//
//        //获取支付宝POST过来反馈信息(返回的结果非常的多，需要程序自行解析)
//        HashMap<String, String> params = new HashMap<String, String>();
//        Map<String, String[]> requestParams = request.getParameterMap();
//        //1. 将回调请求中，携带的参数，进行转换，全部转为 HashMap<String,String>的格式
//        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
//            String name = iter.next();
//            String[] values = requestParams.get(name);
//            String valueStr = "";
//            for (int i = 0; i < values.length; i++) {
//                valueStr = (i == values.length - 1) ? valueStr + values[i]
//                        : valueStr + values[i] + ",";
//            }
//            params.put(name, valueStr);
//        }
//        /* 实际验证过程建议商户务必添加以下校验：
//            1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
//            2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
//            3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
//            4、验证app_id是否为该商户本身。
//            */
//        //主要用于校验
//        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayParams.getAlipayPublicKey(), AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名
//
//        if (signVerified) {//验证成功
//            //商户订单号
//            String out_trade_no = request.getParameter("out_trade_no");
//            //支付宝交易号（这个参数，是支付宝方支付成功后，生成的一个支付交易单号。主要用于：对帐）
//            String trade_no = request.getParameter("trade_no");
//            //交易状态
//            String trade_status = request.getParameter("trade_status");
//            //交易成功
//            if (trade_status.equals("TRADE_SUCCESS")) {
//                //TODO 这里将是处理支付成功之后的，业务逻辑
//
//                return "success";
//            }
//        }
//        return "failure";
//    }
//}
